/**
 * @author[wengcj]
 * @version[创建日期，2021/11/4 9:25]
 * @function[功能简介 ]
 **/
package com.example.iocdemo;

import android.view.View;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class InjectUtil {

    //第一版本
//    public static void init(Object content) {
//        //1.获取类中所有的方法
//        Method[] methods = content.getClass().getMethods();
//        for (Method method : methods) {
//            //2.找到有标注注解的方法
//            OnClick onClick = method.getAnnotation(OnClick.class);
//            if (onClick != null) {
//                int[] value = onClick.value();
//                try {
//                    //3.通过反射获取findViewById方法
//                    Method findViewById = content.getClass().getMethod("findViewById", int.class);
//                    for (int i : value) {
//                        //4.获取控件
//                        View view = (View) findViewById.invoke(content, i);
//                        if (view != null) {
//                            //5.设置监听
//                            view.setOnClickListener(v -> {
//                                try {
//                                    //6.方法回调 method-> 就是我们外面标注注解的方法
//                                    method.invoke(content, v);
//                                } catch (IllegalAccessException | InvocationTargetException e) {
//                                    e.printStackTrace();
//                                }
//                            });
//                        }
//                    }
//
//
//                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }

    //第二版本
//    public static void init(Object content) {
//        //1.获取类中所有的方法
//        Method[] methods = content.getClass().getMethods();
//        for (Method method : methods) {
//            //2.找到有标注注解的方法
//            OnClick onClick = method.getAnnotation(OnClick.class);
//            if (onClick != null) {
//                int[] value = onClick.value();
//                try {
//                    //3.通过反射获取findViewById方法
//                    Method findViewById = content.getClass().getMethod("findViewById", int.class);
//                    for (int i : value) {
//                        //4.获取控件
//                        View view = (View) findViewById.invoke(content, i);
//                        //5.通过代理获取View.OnClickListener
//                        View.OnClickListener listener = (View.OnClickListener) Proxy.newProxyInstance(content.getClass().getClassLoader(), new Class[]{View.OnClickListener.class}, new OnClickInvocationHandler(content,method));
//                        //6.设置监听
//                        view.setOnClickListener(listener);
//                    }
//                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }

    //第三版本
//    public static void init(Object content) {
//        //1.获取类中所有的方法
//        Method[] methods = content.getClass().getMethods();
//        for (Method method : methods) {
//            //2.找到有标注注解的方法
//            OnClick onClick = method.getAnnotation(OnClick.class);
//            OnLongClick longClick = method.getAnnotation(OnLongClick.class);
//            if (onClick != null) {
//                int[] value = onClick.value();
//                try {
//                    //3.通过反射获取findViewById方法
//                    Method findViewById = content.getClass().getMethod("findViewById", int.class);
//                    for (int i : value) {
//                        //4.获取控件
//                        View view = (View) findViewById.invoke(content, i);
//                        //5.通过代理获取View.OnClickListener
//                        View.OnClickListener listener = (View.OnClickListener) Proxy.newProxyInstance(content.getClass().getClassLoader(), new Class[]{View.OnClickListener.class}, new OnClickInvocationHandler(content, method));
//                        //6.设置监听
//                        view.setOnClickListener(listener);
//                    }
//                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
//                    e.printStackTrace();
//                }
//            }
//
//            if (longClick != null) {
//                int[] value = longClick.value();
//                try {
//                    //3.通过反射获取findViewById方法
//                    Method findViewById = content.getClass().getMethod("findViewById", int.class);
//                    for (int i : value) {
//                        //4.获取控件
//                        View view = (View) findViewById.invoke(content, i);
//                        //5.通过代理获取View.OnLongClickListener
//                        View.OnLongClickListener listener = (View.OnLongClickListener) Proxy.newProxyInstance(content.getClass().getClassLoader(),
//                                new Class[]{View.OnLongClickListener.class}, new OnClickInvocationHandler(content, method));
//                        //6.设置监听
//                        view.setOnLongClickListener(listener);
//                    }
//                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }

    //第三版本2
    public static void init(Object content) {

        Method[] methods = content.getClass().getMethods();
        for (Method method : methods) {
            //1.获取方法中所有的注解
            Annotation[] annotations = method.getAnnotations();
            for (Annotation annotation : annotations) {
                //2.找到注解的注解是BaseEvent的
                Class<? extends Annotation> annotationType = annotation.annotationType();
                BaseEvent baseEvent = annotationType.getAnnotation(BaseEvent.class);
                if (baseEvent != null) {
                    //3.1获取需要设置的方法
                    String listenerSetter = baseEvent.listenerSetter();
                    //3.2获取需要传的参数
                    Class<?> listenerType = baseEvent.listenerType();
                    //3.3获取需要返回的回调
                    String callbackMethod = baseEvent.callbackMethod();

                    try {
                        //4.1 获取注解中value方法
                        Method value = annotationType.getDeclaredMethod("value");
                        //4.1 获取需要注册的控件
                        int[] values = (int[]) value.invoke(annotation);
                        try {
                            //3.通过反射获取findViewById方法
                            Method findViewById = content.getClass().getMethod("findViewById", int.class);
                            for (int i : values) {
                                //4.获取控件
                                View view = (View) findViewById.invoke(content, i);
                                //5.通过代理获取View.OnClickListener
                                Object proxy =Proxy.newProxyInstance(content.getClass().getClassLoader(), new Class[]{listenerType}, new OnClickInvocationHandler(content, method));
                                //6.1 获取设置监听方法 setOnClickListener
                                Method method1 = view.getClass().getMethod(listenerSetter,listenerType);
                                //6.2 设置监听
                                method1.invoke(view,proxy);
                            }
                        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}
